# 函数 面向过程编程
def step(n, x, y, z):
    print(x, y, z)
    res = 1
    for i in range(1, n+1):
        res *= i
    return res


# print(step(5,x=1,z=3,y=2)) #位置参数必须放在关键参数前边


# def register(name, age, sex="男性"):
#     print(name, age, sex)


# register("张三",18)
# register("张三1",18,"女性")


# 参数可选
def name(firstName, lastName, midName=None):
    if midName:
        print(firstName+midName+lastName)
    else:
        print(firstName+lastName)

# name("张","三")
# name("张","三","an ")


# 可变参数  *args  元组形式
def foo(x, y, z, *args):
    print(x, y, z)
    print(args)

# foo(1,2,3,4,5,6,7) #元组打包

# 实参打散

# foo(1,2,3,[4,5,6])
# foo(1,2,3,*[4,5,6])


#可变参数 **kwargs
def a1(x, y, z, **kwargs):
    print(x, y, z)
    print(kwargs)


# a1(1, 2, 3, a=1, b=2, c=3)

# 字典实参打散
# a1(1, 2, 3, **{"a":1, "b":2, "c":3})

# 可变参数组合使用
def a2(*args, **kwargs):
    print(args)
    print(kwargs)


# a2(1, 2, 3, a=4, b=5, c=6)


# 返回值
# 单个返回值
def sum(x, y):
    return x+y
# print(sum(1,2))

# 多个返回值，以元组形式


def aa(x):
    return x, x**2, x**3


# a, b, c = aa(2)
# print(aa(2))



#单元测试  assert断言
# assert 1>2

#匿名函数  lambda 变量:函数体
'''
在参数列表中最适合使用匿名函数，尤其是与key=搭配
'''
ls=[(93,88),(99,89),(43,81)]
# ls.sort() #默认按照元组第一个数字升序排序
ls.sort(key=lambda x: x[1]) #按照元组第2个数字升序排序
print(ls)

####面向过程和面向对象编程
'''
面向过程---以过程为中心的编程思想，以“什么正在发生”为主要目标进行编程
面向对象---将现实世界的事物抽象成对象，更关注“谁在受影响”，更加贴近现实。

以公共汽车举例子
“面向过程”:汽车启动是一个事件，汽车到站是一个事件。。。
在编程序的时候我们关心的是某一个事件，而不是汽车本身，我们分别对启动和到站进行编程序

“面向对象”：构造汽车这个对象
对象包含动力，服役时间，生产厂家等一系列的“属性”
也包含加油、启动、加速、刹车、拐弯、鸣喇叭、到站、维修等一系列的“方法”
通过对象的行为表达相应的事件
'''


